package booroo.swing;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;

import java.awt.Toolkit;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JSeparator;
import javax.swing.ImageIcon;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JTextPane;

// 스윙 시나리오
// 1. 프로그램 제목 설정 : setTitle
// 2. 프로그램 크기 설정 : setBounds
//    x좌표,y좌표,가로크기,세로크기
// 3. 크기변경불가 : setResizable
// 4. 프로그램 아이콘 설정 : setIconImage
// 5. splash 화면설정 - META-INF폴더에 MANIFEST.MF파일작성
//				   - SplashScreen-Image : 항목추가
// 				   - splash화면뜨는시간 : Thread.sleep(2500)
//				   - File - Export : Java - Jar
// 6. Look and Fell 변경 - GUI측면과 디자인 구성에 사용하는 용어
// 					   - 색상,모양,레이아웃,서체,버튼,메뉴등의 동적요소를 의미
//					   - Swing에서 제공하는 룩앤필은 밋밋하기 때문에 이것을 교체하는 특별한 API제공
// 					   - UIManager.setLookAndFeel()
// 7. 프레임 닫기 처리 - 프레임을 닫을때 이벤트를 걸고싶으면 WindowListener - windowClosing을 사용
//				 - 하지만 편의성을 위해 WindowAdapter를 사용하는 것을 추천
// 8. 메뉴추가 - 순서 : JMenuBar-JMenu-JMenuItem 
//						JMenuBar 객체 생성 - JFrame에 setJMenuBar로 등록
//						JMenuItem의 setIcon을 이용해서 아이콘 등록
//						JMenuItem의 setEnable을 이용해서 메뉴활성여부지정
//						JMenuItem의 addActionListener를 이용해서 메뉴클릭시 처리할 이벤트 지정
// 9. 대화상자 표시 - JDialog를 이용해서 대화상자를 만들고 setVisible로 화면에 표시
//					  JDialog창을 닫을때는 dispose() 이용
// 10. JLabel - 문자열 또는 이미지를 출력할때 사용
//				이미지출력시 setIcon을 이용, 그림이 클 경우 나머지 영역을 잘려서 보이지 않을 수 있음
//				문자열출력시 setText를 이용, 여러줄 출력시 <html><pre>에 작성하고 문장끝에 </pre></html>를 추가
//				글자색상은 setForeground, 글자폰트나 모양은  setFont로 설정
// 11. 화면 정중앙에 표시 - setLocationRelativeTo(null)로 설정





public class SwingProject extends JFrame {

	private JPanel contentPane;
	
	private static final String METAL = "javax.swing.plaf.metal.MetalLookAndFeel";
	private static final String NIMBUS = "javax.swing.plaf.nimbus.NimbusLookAndFeel";

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Thread.sleep(2500);	// 5
					JFrame.setDefaultLookAndFeelDecorated(true);
					JDialog.setDefaultLookAndFeelDecorated(true);
					// UIManager.setLookAndFeel(METAL);
					UIManager.setLookAndFeel(NIMBUS);
					SwingProject frame = new SwingProject();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public SwingProject() {
		setIconImage(Toolkit.getDefaultToolkit().getImage(SwingProject.class.getResource("/booroo/swing/images/icon/icon.png")));
		
		setTitle("스윙프로젝트v1");	
		// setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
		// 닫기 버튼 클릭시 이벤트 처리 시작
		addWindowListener(
				// 윈도우(Frame)에서 발생하는 이벤트를 감지하기 위해 WindowListener 추가
				new WindowAdapter() {
					// 이벤트 발생시 그것을 처리하는 메서드들 호출하기 위해 기본 클래스로 정의된 WindowAdapter클래스 생성 
			@Override
			public void windowClosing(WindowEvent e) {	// 윈도우 메인프레임 자체에 걸리는 것이므로 발생주체 확인 필요?
				JFrame f = (JFrame)e.getSource();	// 이벤트를 발생시킨 주체가 누군지 알아냄
				int choice = JOptionPane.showConfirmDialog(f, "정말로 프로그램을 종료하시겠습니까?","프로그램 종료",JOptionPane.YES_NO_OPTION);
				// 확인,취소 버튼으로 이루어진 대화상자를 모달창으로 표시
				
				if(choice == JOptionPane.YES_OPTION)
					f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);	// 대화상자에서 '확인'버튼을 클릭하면 현재 프레임을 닫고 프로그램 종료
				
			} // Closing
				// 윈도우가 닫히는 이벤트 발생시 WindowClosing메서드로 처리
		});// Adapter
		// 닫기 버튼 클릭시 이벤트 처리 시작
		
		setBounds(100, 100, 800, 600);
		setResizable(false);
		setLocationRelativeTo(null);
		
		JMenuBar menuBar = new JMenuBar();
		setJMenuBar(menuBar);
		
		JMenu mnFile = new JMenu(" 파일(F)");
		menuBar.add(mnFile);
		
		JMenuItem miNew = new JMenuItem(" 새로 만들기(N)");
		miNew.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				JOptionPane.showMessageDialog(null, "준비중입니다");
			}
		});
		miNew.setIcon(new ImageIcon(SwingProject.class.getResource("/booroo/swing/images/menu/new.png")));
		mnFile.add(miNew);
		
		JSeparator separator = new JSeparator();
		mnFile.add(separator);
		
		JMenuItem miOpen = new JMenuItem(" 열기(O)");
		mnFile.add(miOpen);
		
		JSeparator separator_2 = new JSeparator();
		mnFile.add(separator_2);
		
		JMenuItem miSave = new JMenuItem(" 저장(S)");
		mnFile.add(miSave);
		
		JSeparator separator_3 = new JSeparator();
		mnFile.add(separator_3);
		
		JMenuItem miPrint = new JMenuItem(" 인쇄(P)");
		mnFile.add(miPrint);
		
		JSeparator separator_1 = new JSeparator();
		mnFile.add(separator_1);
		
		JMenuItem miExit = new JMenuItem(" 끝내기(X)");
		miExit.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				int choice = JOptionPane.showConfirmDialog(null, "정말로 프로그램을 종료하시겠습니까?","프로그램 종료",JOptionPane.YES_NO_OPTION);
				// 확인,취소 버튼으로 이루어진 대화상자를 모달창으로 표시
				
				if(choice == JOptionPane.YES_OPTION)
					System.exit(0);
			}
		});
		miExit.setIcon(new ImageIcon(SwingProject.class.getResource("/booroo/swing/images/menu/close.png")));
		mnFile.add(miExit);
		
		JMenu mnEdit = new JMenu(" 편집(E)");
		menuBar.add(mnEdit);
		
		JMenuItem mntmNewMenuItem = new JMenuItem(" 실행 취소(U)");
		mntmNewMenuItem.setEnabled(false);
		mnEdit.add(mntmNewMenuItem);
		
		JMenu mnView = new JMenu(" 보기(V)");
		menuBar.add(mnView);
		
		JMenu mnLayout = new JMenu(" 배치관리자(L)");
		menuBar.add(mnLayout);
		
		JMenuItem miFlow = new JMenuItem(" Flow Layout(F)");
		miFlow.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				Flow_Layout flow = new Flow_Layout();
				flow.setVisible(true);
			}
		});
		mnLayout.add(miFlow);
		
		JMenuItem miBorder = new JMenuItem(" Border Layout(F)");
		miBorder.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				Border_Layout border = new Border_Layout();
				border.setVisible(true);
			}
		});
		mnLayout.add(miBorder);
		
		JMenuItem miGrid = new JMenuItem(" Grid Layout(G)");
		miGrid.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				Grid_Layout grid = new Grid_Layout();
				grid.setVisible(true);
			}
		});
		mnLayout.add(miGrid);
		
		JMenuItem miCard = new JMenuItem(" Card Layout(C)");
		miCard.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				Card_Layout card = new Card_Layout();
				card.setVisible(true);
			}
		});
		mnLayout.add(miCard);
		
		JMenu mnTool = new JMenu(" 도구(T)");
		menuBar.add(mnTool);
		
		JMenu mnComp = new JMenu(" 컴퍼넌트(C)");
		menuBar.add(mnComp);
		
		JMenuItem miBComp = new JMenuItem(" 기본 컴퍼넌트(B)");
		miBComp.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				BComp bc = new BComp();
				bc.setVisible(true);
				
			}
		});
		mnComp.add(miBComp);
		
		JMenuItem miAComp = new JMenuItem(" 고급 컴퍼넌트(A)");
		miAComp.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				AComp ac = new AComp();
				ac.setVisible(true);
			}
		});
		mnComp.add(miAComp);
		
		JMenuItem miJtable = new JMenuItem(" JTable(T)");
		miJtable.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				CJTable jt = new CJTable();
				jt.setVisible(true);
			}
		});
		mnComp.add(miJtable);
		
		JMenu mnNewMenu = new JMenu("JDBC(J)");
		menuBar.add(mnNewMenu);
		
		JMenuItem mntmNewMenuItem_1 = new JMenuItem("데이터 입력");
		mnNewMenu.add(mntmNewMenuItem_1);
		
		JMenuItem mntmNewMenuItem_2 = new JMenuItem("데이터 조회/수정/삭제");
		mnNewMenu.add(mntmNewMenuItem_2);
		
		JMenuItem mntmNewMenuItem_4 = new JMenuItem("우편번호검색");
		mnNewMenu.add(mntmNewMenuItem_4);
		
		JMenuItem mntmNewMenuItem_3 = new JMenuItem("이미지 처리");
		mnNewMenu.add(mntmNewMenuItem_3);
		
		JMenu mnHelp = new JMenu(" 도움말(H)");
		menuBar.add(mnHelp);
		
		JMenuItem miAbout = new JMenuItem(" 스윙프로젝트에 관하여...");
		miAbout.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				AboutProject about = new AboutProject();
				about.setVisible(true);
			}
		});
		mnHelp.add(miAbout);
		
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		contentPane.setLayout(new BorderLayout(0, 0));
		setContentPane(contentPane);
	}

}
